package controllers

import (
	"bluebell/dao/mysql"
	"bluebell/logic"
	"bluebell/models"
	"errors"
	"github.com/gin-gonic/gin"
	"github.com/go-playground/validator/v10"
	"go.uber.org/zap"
)

// 处理请求的函数
func SignUpHandler(c *gin.Context) {
	//1. 获取参数和校验参数
	//将参数自动绑定到结构体中
	p := new(models.ParamsSigUp)
	if err := c.ShouldBindJSON(p); err != nil {
		//记录错误日志
		zap.L().Error("SigUp with invalid param", zap.Error(err))
		//判断err是不是var
		errs, ok := err.(validator.ValidationErrors)
		if !ok {
			ResponseError(c, CodeInvalidParam)
			return
		}
		ResponseErrorWithMsg(c, CodeInvalidParam, removeTopStruct(errs.Translate(trans)))
		return
	}
	//2. 业务处理
	if err := logic.SigUp(p); err != nil {
		zap.L().Error("logic.SigUp with invalid param", zap.Error(err))
		if errors.Is(err, mysql.ErrorUserExist) {
			ResponseError(c, CodeUserExist)
		}
		ResponseError(c, CodeServerBusy)
		return
	}
	//3. 返回响应
	ResponseSuccess(c, nil)
}

//登录
func LoginHandler(c *gin.Context) {
	//获取请求的参数校验
	p := new(models.ParamsLogin)
	if err := c.ShouldBindJSON(p); err != nil {
		//记录错误日志
		zap.L().Error("Login with invalid param", zap.Error(err))
		//判断err是不是var
		errs, ok := err.(validator.ValidationErrors)
		if !ok {
			ResponseError(c, CodeInvalidParam)
			return
		}
		ResponseErrorWithMsg(c, CodeInvalidParam, removeTopStruct(errs.Translate(trans)))
		return
	}
	//2. 业务处理

	token, err := logic.Login(p)
	if err != nil {
		zap.L().Error("logic.Login with failed", zap.Error(err))
		if errors.Is(err, mysql.ErrorUserNotExist) {
			ResponseError(c, CodeUserNotExist)
		}
		ResponseError(c, CodeInvalidPassword)
		return
	}

	//3. 返回响应
	ResponseSuccess(c, token)

}
